/**
 * @file    drv_gpio.c
 * @brief   GPIO内部驱动
 * @author  Liu Wei
 * @version 1.0.1
 * @date    2023-04-14
 * 
 * @copyright Copyright (c) 2023 JBD-Energy Storage Technology Co. LTD
 * 
 * @par 修改日志:
 * <table>
 * <tr><th>Date       <th>Version   <th>Author   <th>Description
 * <tr><td>2023-04-14 <td>1.0.1     <td>Liu wei  <td>首次创建
 * </table>
 */

/* includes ------------------------------------------------------------------*/
#include "drv_gpio.h"
#include "drv_mcu.h"
/* macro/define --------------------------------------------------------------*/

/* typedef -------------------------------------------------------------------*/

/* local functions -----------------------------------------------------------*/

/* static variables ----------------------------------------------------------*/

/* global variables ----------------------------------------------------------*/

/** ------------------------------------------------------------------------- *
  *                             Global function
 ** ------------------------------------------------------------------------- */
/**
 * @brief  配置GPIO 模式
 * @param  port : 端口 
 * @param  u32PinMask : 引脚 BIT0~BIT16
 * @param  u32Mode : 模式
 *         GPIO_MODE_OUTPUT ：输出模式
 *         GPIO_MODE_INPUT  : 输入模式
 */
void drv_gpio_cfg_mode(GPIO_PORT port, GPIO_PIN u32PinMask, uint32_t u32Mode)
{
	uint32_t i;

    for(i = 0ul; i < GPIO_PIN_MAX; i++)
    {
        if((u32PinMask & (1ul << i))==(1ul << i))
        {
            port->MODE = (port->MODE & ~(0x3ul << (i << 1))) | (u32Mode << (i << 1));
        }
    }
}

/**
 * @brief  设置引脚输出为高
 * @param  port : 端口
 * @param  pin : 引脚
 */
void drv_gpio_set_pin(GPIO_PORT port, GPIO_PIN pin)
{
	port->DOUT |= pin;
}

/**
 * @brief  设置引脚输出为低
 * @param  port : 端口
 * @param  pin : 引脚
 */
void drv_gpio_reset_pin(GPIO_PORT port, GPIO_PIN pin)
{
	port->DOUT &= ~pin;
}

/**
 * @brief  翻转IO口
 * @param  port : 端口
 * @param  pin : 引脚
 */
void drv_gpio_toggle_pin(GPIO_PORT port, GPIO_PIN pin)
{
	if(port->DOUT & pin)
	{
		port->DOUT &= ~pin;
	}
	else
	{
		port->DOUT |= pin;
	}
}

/**
 * @brief  读取某个引脚的状态
 * @param  port : 端口
 * @param  pin : 引脚
 * @return GPIO_STATE 
 */
GPIO_STATE drv_gpio_read_pin(GPIO_T *port, uint32_t pin)
{
	if(port->PIN & pin)
		return GPIO_SET;
	else
		return GPIO_RESET;
}

/**
 * @brief  读取某个引脚输出状态
 * @param  port : 端口
 * @param  pin : 引脚
 * @return GPIO_STATE 
 */
GPIO_STATE drv_gpio_read_out_pin(GPIO_T *port, uint32_t pin)
{
	if(port->DOUT & pin)
		return GPIO_SET;
	else
		return GPIO_RESET;
}
/** ------------------------------------------------------------------------- *
  *                              Local function
 ** ------------------------------------------------------------------------- */
 
/******************************(C)Copyright end *******************************/

